﻿#region librerías﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Librerias;
using System.Data;
using System.Collections;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
#endregion


namespace Librerias
{
    #region Excepciones de CADProfesor
    //   public class Excepcion_Conexion : Exception { override public string ToString() { return "Error en la conexión a la base de datos"; } }
    public class Excepcion_CrearUsaurio : Exception { override public string ToString() { return "No se ha podido registrae el usuario"; } }
    public class Excepcion_BorrarUsuario : Exception { override public string ToString() { return "No se ha podido borrar el usuario"; } }
    public class Excepcion_ModificarUsuario : Exception { override public string ToString() { return "No se ha actualizado el usuario"; } }
    // public class Excepcion_CambioPass : Exception { override public string ToString() { return "No se ha podido cambiar la contraseña"; } }
    #endregion

    /// <summary>
    /// Clase: CAD Usuario
    /// </summary>
    public class CADUsuario
    {
        #region variables-doc
        /// <summary>
        /// Conexión con BD
        /// </summary>
        SqlConnection c;
        string correo;
        int tipo;

        #endregion

        #region CADUsuario-doc
        /// <summary>
        /// constructor por defecto
        /// </summary>
        public CADUsuario()
        {
            c = new SqlConnection(CADConexion.connString);
        }
        #endregion

        #region CrearUsuario(ENUsuario entidadUsuario)-doc
        /// <summary>
        /// Da de alta una usuario
        /// </summary>
        /// <param name="entidadUsuario">EN de usuario a dar de alta</param>
        /// <param name="barraProgreso">Barra de progreso para subir imagen del usuario</param>
        public void CrearUsuario(ENUsuario entidadUsuario, ProgressBar barraProgreso = null)
        {
            try
            {
                c = new SqlConnection(CADConexion.connString);
                c.Open();


                //Si hay una imagen, la sube a DropBox y actualiza la ruta de la imagen
                if (entidadUsuario.Imagen != "")
                {
                    string rutaDropbox = "/imagenPerfil/" + entidadUsuario.Correo.Replace("@", "-") + "/";

                    CADGestionDropbox drop = new CADGestionDropbox();
                    if (!drop.CreaDir(rutaDropbox)) throw new Exception("No se pudo cargar la imagen");

                    rutaDropbox += CADGestionDropbox.GetFicheroFromRuta(entidadUsuario.Imagen);

                    if (drop.Subir(entidadUsuario.Imagen, rutaDropbox, barraProgreso))
                    {
                        entidadUsuario.Imagen = rutaDropbox;
                    }
                    else
                    {
                        throw new Exception("No se pudo cargar la imagen");
                    }
                }

                SqlCommand com = new SqlCommand("insert into usuario (usuCorreo, usuClave, usuNombre, usuApellido1, usuApellido2,usuDepto,usuImagen,usuTipo,usuTelefono,usuCorreoAlternativo) values('" +
                                                entidadUsuario.Correo + "','" +
                                                entidadUsuario.Contraseña + "','" +
                                                entidadUsuario.Nombre + "','" +
                                                entidadUsuario.Apellido1 + "','" +
                                                entidadUsuario.Apellido2 + "','" +
                                                entidadUsuario.Departamento + "','" +
                                                entidadUsuario.Imagen + "','" +
                                                entidadUsuario.Tipo + "','" +
                                                entidadUsuario.Telefono + "','" +
                                                entidadUsuario.CorreoAlternativo + "');", c);

                com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al insertar en la tabla 'usuario'\n" + ex.Message);
            }
            finally
            {
                c.Close();
            }
        }
        #endregion

        #region CrearUsuarioAdminEstu(ENUsuario entidadUsuario)-doc
        /// <summary>
        /// Crea un usuario del tipo: Estudiante o Administrador
        /// </summary>
        /// <param name="e">Entidad de Negocio de Usuario</param>
        public void CrearUsuarioAdminEstu(ENUsuario e)
        {
            int res = 0;
            c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();

                SqlCommand com = new SqlCommand("insert into usuario (usuCorreo, usuClave,usuCorreoAlternativo, usuNombre, usuApellido1, usuApellido2,usuImagen,usuTipo,usuTelefono) values('" +
                                              e.Correo + "','" +
                                              e.Contraseña + "','" +
                                               e.CorreoAlternativo + "','" +
                                              e.Nombre + "','" +
                                             e.Apellido1 + "','" +
                                             e.Apellido2 + "','" +
                                              e.Imagen + "','" +
                                                e.Tipo + "','" +
                                              e.Telefono + "');", c);



                res = com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al insertar en la tabla 'usuario'\n" + ex.Message);
            }
            finally
            {
                c.Close();
            }
        }
        #endregion

        #region DescargarImagen(string correo, string rutaImagen)-doc
        /// <summary>
        /// Dado un usuario y una ruta nos trae su imagen y la deja en esta ruta
        /// </summary>
        /// <param name="correo">correo del usuario</param>
        /// <param name="rutaImagen">ruta en la que dejar la imagen</param>
        public void DescargarImagen(string correo, string rutaImagen)
        {
            c.Open();
            string select = "select usuImagen" +
                            " from usuario where usuCorreo = '" + correo + "'";

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, c);
            c.Close();

            DataTable res = new DataTable();
            adaptadorSQL.Fill(res);

            string rutaDropBox = res.Rows[0].ItemArray[0].ToString();

            CADGestionDropbox drop = new CADGestionDropbox();
            drop.Descargar(rutaDropBox, rutaImagen);
        }
        #endregion

        #region ModificarUsuario(ENUsuario u, ProgressBar barra = null)-doc
        /// <summary>
        /// Actualiza los datos en la BD de un usuario: con barra de progreso para la imagen
        /// </summary>
        /// <param name="u">Entidad Negocio de Usuario</param>
        /// <param name="barra">Barra de progreso</param>    
        public void ModificarUsuario(ENUsuario u, ProgressBar barra = null)
        {
            SqlConnection c = new SqlConnection(CADConexion.connString);
            c.Open();

            //Si hay una imagen y no es la de DropBox hay una nueva imagen.
            // Hay que borrar la antigua, subir la nueva y escribir su ruta en u.Imagen
            if (u.Imagen != "" && !u.Imagen.StartsWith("/"))
            {
                string rutaDropbox = "/imagenPerfil/" + u.Correo.Replace("@", "-") + "/";

                CADGestionDropbox drop = new CADGestionDropbox();

                drop.Borrar(rutaDropbox);

                if (drop.CreaDir(rutaDropbox)
                    && drop.Subir(u.Imagen, rutaDropbox, barra))
                {
                    u.Imagen = rutaDropbox + CADGestionDropbox.GetFicheroFromRuta(u.Imagen);
                }
                else throw new Exception("No se pudo cargar la imagen");
            }

            new SqlCommand("update usuario set " +
                                "usuClave='" + u.Contraseña +
                                "',usuCorreoAlternativo='" + u.CorreoAlternativo +
                                "',usuNombre='" + u.Nombre +
                                "', usuApellido1='" + u.Apellido1 +
                                "', usuApellido2='" + u.Apellido2 +
                                "', usuDepto='" + u.Departamento +
                                "', usuImagen='" + u.Imagen +
                                "', usuTipo='" + u.Tipo +
                                "', usuTelefono='" + u.Telefono +
                                "' where usuCorreo='" + u.Correo + "';", c).ExecuteNonQuery();
            c.Close();
        }
        #endregion

        #region ModificarUsuarioAdminEstu(ENUsuario u)-doc
        /// <summary>
        /// Modifica un usuario: rol Administrador o Estudiante
        /// </summary>
        /// <param name="u">Entidad de Negocio del Usuario</param>
        public void ModificarUsuarioAdminEstu(ENUsuario u)
        {
            int res = 0;
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("update usuario set " +
                                               "usuClave='" + u.Contraseña +
                                              "',usuCorreoAlternativo='" + u.CorreoAlternativo +
                                            "',usuNombre='" + u.Nombre +
                                             "', usuApellido1='" + u.Apellido1 +
                                              "', usuApellido2='" + u.Apellido2 +
                                                "', usuImagen='" + u.Imagen +
                                             "', usuTipo='" + u.Tipo +
                                               "', usuTelefono='" + u.Telefono +
                                            "' where usuCorreo='" + u.Correo + "';", c);
                res = com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {

                c.Close();
                c.Dispose();
            }
        }
        #endregion

        #region Modifica Clave Usuario-doc
        /// <summary>
        /// Nos permite Modificar la clave del usuario
        /// </summary>
        /// <param name="correoUsuario">Correo del usuario</param>
        /// <param name="nuevaClave">Nueva clave</param>
        public void ModificarClave(string correoUsuario, string nuevaClave)
        {
            int res = 0;
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("update usuario set " +
                                                 "usuClave='" + nuevaClave +
                                                 "' where usuCorreo='" + correoUsuario + "';", c);
                res = com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {

                c.Close();
                c.Dispose();
            }
        }
        #endregion

        #region Modifica Teléfono de Usuario-doc
        /// <summary>
        /// Moodifica Teléfono de un Usuario
        /// </summary>
        /// <param name="CorreoUsuario">Usuario del usuario</param>
        /// <param name="nuevoTlf">Nuevo teléfono</param>
        public void ModificarTelefono(string CorreoUsuario, string nuevoTlf)
        {
            int res = 0;
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("update usuario set " +
                                                "usuTelefono='" + nuevoTlf +
                                                "' where usuCorreo='" + CorreoUsuario + "';", c);
                res = com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                c.Close();
                c.Dispose();
            }
        }
        #endregion

        #region Modifica Correo Alternativo de un Usuario-doc
        /// <summary>
        /// Posibilitar cambiar teléfono alternativo de un usuario
        /// </summary>
        /// <param name="CorreoUsuario">Usuario del usuario</param>
        /// <param name="nuevoCorreoAlternativo">Correo Alternativo Nuevo</param>
        public void ModificarCorreoAlt(string CorreoUsuario, string nuevoCorreoAlternativo)
        {
            int res = 0;
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("update usuario set " +
                                                 "usuCorreoAlternativo='" + nuevoCorreoAlternativo +
                                                 "' where usuCorreo='" + CorreoUsuario + "';", c);
                res = com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {

                c.Close();
                c.Dispose();
            }
        }
        #endregion

        #region ModificarImagen(string CorreoUsuario, Image nuevaImagen)-doc
        /// <summary>
        /// Modificar Imagen de un usuario
        /// </summary>
        /// <param name="CorreoUsuario">Correo del usuario</param>
        /// <param name="nuevaImagen">Imagen nueva</param>
        public void ModificarImagen(string CorreoUsuario, Image nuevaImagen)
        {
            int res = 0;
            SqlConnection c = new SqlConnection(CADConexion.connString);

            SqlCommand com = new SqlCommand("update usuario set usuImagen=@pic where usuCorreo='" + CorreoUsuario + "';", c);
            MemoryStream stream = new MemoryStream();
            nuevaImagen.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] pic = stream.ToArray();
            com.Parameters.AddWithValue("@pic", pic);

            try
            {
                c.Open();
                res = com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                c.Close();
                c.Dispose();
            }
        }
        #endregion

        #region BorrarUsuario(ENUsuario u)-doc
        /// <summary>
        /// Borra los datos de la base de datos correspondientes al ENProfesor
        /// </summary>
        /// <param name="u">Profesor a borrarr</param>
        public void BorrarUsuario(ENUsuario u)
        {

            int res = 0;
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("delete from usuario where usuCorreo = '" + u.Correo + "';", c);

                res = com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al eliminar en la tabla " + ex.Message);
            }
            finally
            {

                c.Close();
            }
        }
        #endregion

        #region DataTable ConsultaUsuarios()-doc
        /// <summary>
        /// Nos devuelve los Usuarios en un DataTable
        /// </summary>
        /// <returns>DataTable con los usuarios</returns>
        public DataTable ConsultaUsuarios()
        {
            DataTable res = new DataTable();

            try
            {
                c.Open();
                string select = "select * from usuario";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, c);
                adaptadorSQL.Fill(res);

            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                c.Close();
            }

            return res;
        }
        #endregion

        #region DataTable ConsultarUsuarios(params string[] datos) multiples parámetros
        /// <summary>
        /// Consulta los usuarios con coincidencia de múltiples datos variables
        /// </summary>
        /// <param name="u">datos es un array con los datos que se quieren consultar</param>
        public DataTable ConsultarUsuarios(params string[] datos)
        {
            String[] nomColumns = new String[] { "usuNombre", "usuApellido1", "usuApellido2", "usuCorreo", "usuTelefono", "usuTipo" };
            int elems = 0;
            String select = "SELECT * ";
            select += " from usuario where ";
            for (int i = 0; i < nomColumns.Length; i++)
            {
                if (datos[i] != "")
                {
                    if (elems != 0)
                    {

                        select += " and (" + nomColumns[i] + " like '%" + datos[i] + "%') ";
                    }
                    else
                    {

                        select += " ( " + nomColumns[i] + " like '%" + datos[i] + "%') ";
                        elems++;
                    }


                }
            }
            select += ";";
            DataTable res = new DataTable();
            try
            {
                c.Open();
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, c);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                c.Close();
            }
            return res;
        }
        #endregion

        #region Consulta de (los profesores responsables)|(alumnos cursando) una asignatura
        /// <summary>
        /// Consulta de los profesores responsables de una asignatura
        /// </summary>
        /// <param name="codigoAsignatura">String del código de la asignatura</param>
        /// <param name="tipoUsu">1 prof; 2 alumno</param>
        public DataTable ConsultarUsuariosPorTipoUsuYAsignatura(String codigoAsignatura, int tipoUsu)
        {
            String[] selects = new String[2];
            // Es profesor
            selects[0] = "SELECT distinct asiCodigo, asiNombre, usuCorreo, usuNombre, usuApellido1, usuApellido2, usuDepto ";
            selects[0] += "from asignatura, turno, usuario ";
            selects[0] += " where asiCodigo like '%" + codigoAsignatura.Trim() + "%'  ";
            selects[0] += " and turCodigo = asiCodigo ";
            selects[0] += " and usuCorreo = turCorreo   and usuTipo = '1' ";
            selects[0] += ";";
            // Es alumno
            selects[1] = "SELECT distinct asiCodigo, asiNombre, usuCorreo, usuNombre, usuApellido1, usuApellido2, usuDepto ";
            selects[1] += "from asignatura, cursar, usuario ";
            selects[1] += " where asiCodigo like '%" + codigoAsignatura.Trim() + "%'  ";
            selects[1] += " and curCodigo = asiCodigo ";
            selects[1] += " and usuCorreo = curCorreo   and usuTipo = '2' ";
            selects[1] += ";";

            DataTable res = new DataTable();
            try
            {
                c.Open();
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(selects[tipoUsu - 1], c);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                c.Close();
            }
            return res;
        }
        #endregion

        #region DataTable ConsultarProfesoresPorDepartamento(String codigoDepartamento)
        /// <summary>
        /// Consulta de los profesores de un departamento
        /// </summary>
        /// <param name="u">String del código del departamento</param>
        public DataTable ConsultarProfesoresPorDepartamento(String codigoDepartamento)
        {

            String select = "SELECT * ";
            select += "from usuario ";
            select += " where usuDepto like '%" + codigoDepartamento.Trim() + "%';  ";

            DataTable res = new DataTable();
            try
            {
                c.Open();
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, c);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                c.Close();
            }
            return res;
        }
        #endregion

        #region ConsultaUsuarios(string cadena, int tipo)-doc
        /// <summary>
        /// Dada una cadena la busca en un tipo usuario
        /// </summary>
        /// <param name="cadena">cadena a buscar</param>
        /// <param name="tipo">tipo</param>
        /// <returns>Datatable con la información encontrada</returns>
        public DataTable ConsultaUsuarios(string cadena, int tipo)
        {
            DataTable res = new DataTable();

            try
            {
                c.Open();
                string select = "select * from usuario";

                switch (tipo)
                {
                    case 0:
                        select += " where usuCorreo like '%" + cadena + "%'";
                        break;
                    case 1:
                        select += " where usuNombre like '%" + cadena + "%'";
                        break;
                    case 2:
                        select += " where usuApellido1 like '%" + cadena + "%'";
                        break;
                    case 3:
                        select += " where usuApellido2 like '%" + cadena + "%'";
                        break;
                    case 4:
                        select += " where usuTipo like '%" + cadena + "%'";
                        break;
                    // añadido por Marta
                    case 5:
                        select += " where usuTelefono like '%" + cadena + "%'";
                        break;
                }
                select += " order by usuCorreo desc";

                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, c);
                adaptadorSQL.Fill(res);

            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                c.Close();
            }

            return res;
        }
        #endregion

        #region BuscarCorreoTurno(string correo)-doc
        /// <summary>
        /// Busca correo en Turno
        /// </summary>
        /// <param name="correo">Correo Usuario</param>
        /// <returns>V o F según si lo ha encontrado</returns>
        public bool BuscarCorreoTurno(string correo)
        {
            bool encontrado = false;
            string sql;
            CADConexion miConexion = new CADConexion();
            SqlConnection c = new SqlConnection(CADConexion.connString);
            c.Open();
            DataSet DS = new DataSet();
            int filas = 0;
            try
            {
                encontrado = false;
                //primero inicializad la conexion
                sql = "select turCorreo from turno where  turCorreo like '%" + correo + "%' ";
                filas = miConexion.Consultar(sql, c, ref DS, "turno");
                if (filas > 0)
                    encontrado = true;
            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al consultar en la tabla 'turno'\n" + ex.Message.ToString());
            }
            finally
            {
                c.Close();
            }

            return encontrado;
        }
        #endregion

        #region uscarCorreoCursar(string correo)-doc
        /// <summary>
        /// Busca un correo en Buscar
        /// </summary>
        /// <param name="correo">Correo</param>
        /// <returns>V o F según lo haya encontrado</returns>
        public bool BuscarCorreoCursar(string correo)
        {
            bool encontrado = false;
            string sql;
            CADConexion miConexion = new CADConexion();
            SqlConnection c = new SqlConnection(CADConexion.connString);
            c.Open();
            DataSet DS = new DataSet();
            int filas = 0;
            try
            {
                encontrado = false;
                //primero inicializad la conexion
                sql = "select curCorreo from cursar where  curCorreo like '%" + correo + "%' ";
                filas = miConexion.Consultar(sql, c, ref DS, "cursar");
                if (filas > 0)
                    encontrado = true;
            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al consultar en la tabla 'cursar'\n" + ex.Message.ToString());
            }
            finally
            {
                c.Close();
            }

            return encontrado;
        }
        #endregion

        #region BuscarCorreo(string correoUsuario)-doc
        /// <summary>
        /// Función hace una búsqueda de usuarios por correoUsuario
        /// </summary>
        /// <param name="correo">Correo</param>
        /// <returns>Si lo ha encontrado: V sino F</returns>
        public bool BuscarCorreo(string correo)
        {
            bool encontrado = false;
            string sql;
            CADConexion miConexion = new CADConexion();
            SqlConnection c = new SqlConnection(CADConexion.connString);
            DataSet DS = new DataSet();
            int filas = 0;
            try
            {
                c.Open();
                encontrado = false;
                //primero inicializad la conexion
                sql = "select usuCorreo from usuario where  usuario.usuCorreo like '%" + correo + "%' ";
                filas = miConexion.Consultar(sql, c, ref DS, "usuario");
                if (filas > 0)
                    encontrado = true;
            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al consultar en la tabla 'Persona'\n" + ex.Message.ToString());
            }
            finally
            {
                c.Close();
            }


            return encontrado;
        }
        #endregion

        #region ActualizarUsuario(ENUsuario admNuevo)-deprecado
        public void ActualizarUsuario(ENUsuario admNuevo)
        {
            // Llega un usuario2 que hay que actualizar
        }
        #endregion




        /// <summary>
        /// Nos dirá si es cierto un par correo Alternativo - Teléfono
        /// </summary>
        /// <param name="correoAlter"></param>
        /// <param name="telefono"></param>
        /// <returns></returns>
        public bool SMSAlternativaYTelefono(string correoAlter, string telefono)
        {
            bool encontrado = false;
            string sql;
            CADConexion miConexion = new CADConexion();
            SqlConnection c = new SqlConnection(CADConexion.connString);

            DataSet DS = new DataSet();
            int filas = 0;
            try
            {
                c.Open();
                encontrado = false;
                //primero inicializad la conexion
                sql = "select * from usuario where ((usuCorreoAlternativo='" + correoAlter + "') and (usuTelefono='" + telefono + "'));";
                filas = miConexion.Consultar(sql, c, ref DS, "usuario");
                if (filas > 0)
                    encontrado = true;
            }
            catch (Exception ex)
            {
                throw new System.Exception("Error al consultar en la tabla 'Persona'\n" + ex.Message.ToString());
            }
            finally
            {
                c.Close();
            }

            return encontrado;
        }


        #region ComprobarLogin-doc
        /// <summary>
        /// Pasándole un usuario2 y una contraseña nos dirá si es correcto o si no lo es
        /// </summary>
        /// <param name="nomUsuario">correoUsuario del usuario2 en cuestión</param>
        /// <param name="password">clave de ese usuario2 en cuestión</param>
        /// <returns></returns>
        public bool ComprobarLogin(String nomUsuario, String password)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuTipo from usuario where usuCorreo='" + nomUsuario + "'  " +
                                                             "and usuClave='" + password + "'";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string clavecita;

                    clavecita = reader["usuTipo"].ToString();

                    listado.Add(clavecita);
                }

                if (listado.Capacity != 0)
                {
                    //si ha rellenado será válido
                    salida = true;
                    // tipo = Convert.ToInt32(reader["usuTipo"]);
                }
                else
                    //sino no será válido
                    salida = false;

            }
            catch (Exception)
            {
                return false;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }

        public int GetTipo(String nomUsuario)
        {
            SqlConnection con = null;
            int salida = -1;

            try
            {

                string query = "select usuTipo from usuario where usuCorreo='" + nomUsuario + "'";

                // Establecimiento de conexión
                con = new SqlConnection(CADConexion.connString);
                con.Open();
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(query, con);

                DataTable res = new DataTable();
                adaptadorSQL.Fill(res);

                con.Close();

                if (res.Rows.Count == 1)
                {
                    salida = Convert.ToInt32(res.Rows[0].ItemArray[0]);
                }

            }
            catch (Exception)
            {
            }
            finally
            {
                // Comprobación de conexión abierta
                if ((con != null) && (con.State == ConnectionState.Open))
                {
                    con.Close();
                }
            }

            return salida;
        }


        #region código ernesto-doc
        #endregion
        #region EsClaveValidaAdministrador-doc
        /// <summary>
        /// Nos dice si es clave correcta de ese administrador
        /// </summary>
        /// <param name="correoAdministrador">Correo Administrador</param>
        /// <param name="posibleClave">Clave a comprobar</param>
        /// <returns></returns>
        public bool EsClaveValidaAdministrador(string correoAdministrador, string posibleClave)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuClave from usuario where ((usuCorreo='" + correoAdministrador + "')  " +
                                                             "and (usuClave='" + posibleClave + "') " +
                                                             "and (usuTipo= 0));";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string clavecita;

                    clavecita = reader["usuClave"].ToString();

                    listado.Add(clavecita);
                }

                if (listado.Capacity != 0)
                    //si ha rellenado será válido
                    salida = true;
                else
                    //sino no será válido
                    salida = false;

            }
            catch (SqlException ex)
            {
                throw ex;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region EsClaveValidaProfesor-doc
        /// <summary>
        /// Comprueba si es clave correcta de ese profesor
        /// </summary>
        /// <param name="correoProfesor">Correo profesor</param>
        /// <param name="posibleClave">clave a comprobar</param>
        /// <returns></returns>
        public bool EsClaveValidaProfesor(string correoProfesor, string posibleClave)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuClave from usuario where ((usuCorreo='" + correoProfesor + "')  " +
                                                             "and (usuClave='" + posibleClave + "') " +
                                                             "and (usuTipo= 1));";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string clavecita;

                    clavecita = reader["usuClave"].ToString();

                    listado.Add(clavecita);
                }

                if (listado.Capacity != 0)
                    //si ha rellenado será válido
                    salida = true;
                else
                    //sino no será válido
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region EsClaveValidaAlumno-doc
        /// <summary>
        /// Comprueba si es clave de ese alumno
        /// </summary>
        /// <param name="correoAlumno">correo alumno</param>
        /// <param name="posibleClave">clave a comprobar</param>
        /// <returns></returns>
        public bool EsClaveValidaAlumno(string correoAlumno, string posibleClave)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuClave from usuario where ((usuCorreo='" + correoAlumno + "')  " +
                                                             "and (usuClave='" + posibleClave + "') " +
                                                             "and (usuTipo= 2));";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string clavecita;

                    clavecita = reader["usuClave"].ToString();

                    listado.Add(clavecita);
                }

                if (listado.Capacity != 0)
                    //si ha rellenado será válido
                    salida = true;
                else
                    //sino no será válido
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region dimeUsuarioSegunCorreo-doc
        /// <summary>
        /// Nos devuelve usuario según su correo
        /// </summary>
        /// <param name="correito">correo</param>
        /// <returns>DataTable con el usuario</returns>
        public DataTable dimeUsuarioSegunCorreo(string correito)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "select usuCorreo, usuClave, usuDepto, usuNombre, usuApellido1, usuApellido2, usuImagen, usuTelefono, usuTipo, usuCorreoAlternativo from usuario where usuCorreo ='" + correito + "';";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }

        #endregion
        #region UsuarioSabeSuCorreoAlternativo-doc
        /// <summary>
        /// Chequea si un usuario se sabe su correo Alternativo
        /// </summary>
        /// <param name="correoUsuario">Usuario</param>
        /// <param name="correoAlternativo">Correo Alternativo a comprobar si válido</param>
        /// <returns></returns>
        public bool UsuarioSabeSuCorreoAlternativo(string correoUsuario, string correoAlternativo)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuCorreoAlternativo from usuario where ((usuCorreo='" + correoUsuario + "')  " +
                                                             "and (usuCorreoAlternativo='" + correoAlternativo + "'));";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string clavecita;

                    clavecita = reader["usuCorreoAlternativo"].ToString();

                    listado.Add(clavecita);
                }

                if (listado.Capacity != 0)
                    //si ha rellenado será válido
                    salida = true;
                else
                    //sino no será válido
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region refrescaMemoriaMedianteCorreoAlternativo
        /// <summary>
        /// Nos dirá correo alternativo, clave según su correo
        /// </summary>
        /// <param name="usuario">DataTable con la información</param>
        /// <returns></returns>
        public DataTable refrecaMemoriaMedianteCorreoAlternativo(string usuario)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "select usuCorreo, usuCorreoAlternativo, usuClave from usuario where (usuCorreo ='" + usuario + "');";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region dimeUsuarioSegunCorreoAlternativo-doc
        /// <summary>
        /// Nos devuelve usuario según su correoAlt
        /// </summary>
        /// <param name="correitoAlternativo">correoAlt</param>
        /// <returns>DataTable con el usuario</returns>
        public DataTable dimeUsuarioSegunCorreoAlternativo(string correitoAlternativo)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "select usuCorreo from usuario where usuCorreoAlternativo ='" + correitoAlternativo + "';";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }

        #endregion
        #endregion


        /****************************** + Parte Arturo + ********************************/

        private string MisAsignaturas()
        {
            if (tipo == 1)
            {
                return "SELECT DISTINCT turCodigo AS curCodigo FROM turno AS cursar_1" +
                        " WHERE (turCorreo = '" + correo + "')";
            }
            else
            {
                return "SELECT curCodigo FROM cursar AS cursar_1" +
                        " WHERE (curCorreo = '" + correo + "')";
            }
        }

        private string MisAlumnos()
        {
            return "SELECT cursar.curCorreo, cursar.curCodigo FROM cursar INNER JOIN" +
                    " (" + MisAsignaturas() + ") AS MisAsigs" +
                    " ON cursar.curCodigo = MisAsigs.curCodigo";
        }

        private string MisProfesores()
        {
            return "SELECT DISTINCT turno.turCorreo AS curCorreo, turno.turCodigo AS curCodigo" +
                    " FROM turno INNER JOIN" +
                    " (" + MisAsignaturas() + ") AS MisAsigs" +
                    " ON turno.turCodigo = MisAsigs.curCodigo";
        }

        public string MiRedAux()
        {
            return "SELECT usuario.usuCorreo, usuario.usuNombre, usuario.usuApellido1, usuario.usuApellido2, usuario.usuTipo,usuario.usuImagen, count(*) curCodigo" +
                        " FROM usuario INNER JOIN (" + MisProfesores() + " UNION " + MisAlumnos() + ") AS MisProfes" +
                        " ON usuario.usuCorreo = MisProfes.curCorreo " +
                        " GROUP BY usuario.usuCorreo, usuario.usuNombre, usuario.usuApellido1, usuario.usuApellido2, usuario.usuTipo, usuario.usuImagen";
        }

        public DataTable MiRed(string correoUsu, int tipoUsu)
        {
            correo = correoUsu;
            tipo = tipoUsu;

            string select = MiRedAux();

            SqlConnection con = new SqlConnection(CADConexion.connString);
            con.Open();

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            DataTable tabla = new DataTable();
            adaptadorSQL.Fill(tabla);

            con.Close();

            return tabla;
        }


        public string MiRedBusAux(string busqueda)
        {
            return "SELECT usuario.usuCorreo, usuario.usuNombre, usuario.usuApellido1, usuario.usuApellido2, usuario.usuTipo,usuario.usuImagen, count(*) curCodigo" +
                        " FROM usuario INNER JOIN (" + MisProfesores() + " UNION " + MisAlumnos() + ") AS MisProfes" +
                        " ON usuario.usuCorreo = MisProfes.curCorreo " +
                        " WHERE usuario.usuNombre + ' ' + usuario.usuApellido1 + ' ' + usuario.usuApellido2 like '%"+ busqueda + "%' "+
                        " GROUP BY usuario.usuCorreo, usuario.usuNombre, usuario.usuApellido1, usuario.usuApellido2, usuario.usuTipo, usuario.usuImagen";
        }

        public DataTable MiRedBuscar(string correoUsu, int tipoUsu, string busqueda)
        {
            correo = correoUsu;
            tipo = tipoUsu;

            string select = MiRedBusAux(busqueda);

            SqlConnection con = new SqlConnection(CADConexion.connString);
            con.Open();

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            DataTable tabla = new DataTable();
            adaptadorSQL.Fill(tabla);

            con.Close();

            return tabla;
        }

        public void SetImagen(string usu, string imagen)
        {
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("update usuario set " +
                                              " usuImagen='" + imagen +
                                            "' where usuCorreo='" + usu + "';", c);
                com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                c.Close();
            }
        }

        public void SetTelefonoYCorreoAlternativo(string usu, string telefono, string correo2)
        {

            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("update usuario set " +
                                              " usuCorreoAlternativo='" + correo2 +
                                               "', usuTelefono='" + telefono +
                                            "' where usuCorreo='" + usu + "';", c);
                com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                c.Close();
            }
        }

        public void SetTelefonoYCorreoAlternativoYClave(string usu, string telefono, string correo2, string clave)
        {

            int res = 0;
            SqlConnection c = new SqlConnection(CADConexion.connString);
            try
            {
                c.Open();
                SqlCommand com = new SqlCommand("update usuario set " +
                                              " usuCorreoAlternativo='" + correo2 +
                                               "', usuTelefono='" + telefono +
                                               "', usuClave='" + clave +
                                            "' where usuCorreo='" + usu + "';", c);
                res = com.ExecuteNonQuery();

            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                c.Close();
            }
        }

        public string MisAsigs(string correo)
        {
            return "SELECT DISTINCT turCodigo AS curCodigo FROM turno AS cursar_1" +
                    " WHERE (turCorreo = '" + correo + "')" + " UNION " +
                    "SELECT curCodigo FROM cursar AS cursar_1" +
                    " WHERE (curCorreo = '" + correo + "')";
        }

        public DataTable AsignaturasComunes(string correo1, string correo2)
        {
            string select = "SELECT a.curCodigo " +
                            "from ( " + MisAsigs(correo1) + " ) as a, ( " + MisAsigs(correo2) + ") as b " +
                            "where a.curCodigo = b.curCodigo";

            SqlConnection con = new SqlConnection(CADConexion.connString);
            con.Open();

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            DataTable tabla = new DataTable();
            adaptadorSQL.Fill(tabla);

            con.Close();

            return tabla;
        }
    }
}
